#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

int position_x,position_y;
int bullet_x,bullet_y;
int enemy_x,enemy_y;
int high,width;
int score;
int enemy_speed_limit=15;//控制敌机下落速度（可变）
int Degree_of_difficulty=0;//游戏难度

void gotoxy(int x,int y)//类似于清屏函数，光标移动到原点位置进行重画
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}

void startup() {
	high=18;
	width=30;

	position_x=high/2;
	position_y=width/2;
	
	bullet_x=-1;
	bullet_y=position_y;

	enemy_x=0;
	enemy_y=width/2;

	score=0;
}

void show() {
	gotoxy(0,0);

	int i,j;
	//system("cls");

	for (i=0;i<=high;i++) {
		for (j=0;j<=width;j++) {
			 if ((i==position_x)&&(j==position_y))
				printf("*");
			 else if ((i==position_x+1)&&(j==position_y-1))
				 printf("*");
			 else if ((i==position_x+1)&&(j==position_y))
				 printf(" ");
			 else if ((i==position_x+1)&&(j==position_y+1))
				printf("*");
			 else if ((i==bullet_x-1)&&(j==bullet_y))
				printf("|");
			 else if ((i==enemy_x)&&(j==enemy_y))
				printf("@");
			 else if (i==high)//下边界
				 printf("-");
			 else if (j==width)//左边界
				 printf("|");
			 else
				printf(" ");
		}
		printf("\n");
	}
	printf("得分:%d\n",score);
	printf("难度:%d",Degree_of_difficulty);
	if (enemy_speed_limit==1)
		printf("(max)");
}

void updateWithInput() {//输入有关
	char input;

	if (kbhit()) {
		input=getch();
		if (input==27)//按esc暂停
			system("pause");
		if ((position_y<width-2)&&(position_x<high-2)&&(position_x>1)&&(position_y>1)){//控制飞机移动和边界
			if (input=='a')
				position_y--;
			if (input=='d')
				position_y++;
			if (input=='w')
				position_x--;
			if (input=='s')
				position_x++;
		}
		else if (position_y==width-2) {
			if (input=='a')
				position_y--;
			if (input=='w')
				position_x--;
			if (input=='s')
				position_x++;
		}
		else if (position_x==high-2) {
			if (input=='a')
				position_y--;
			if (input=='d')
				position_y++;
			if (input=='w')
				position_x--;
		}
		else if (position_x==1) {
			if (input=='a')
				position_y--;
			if (input=='d')
				position_y++;
			if (input=='s')
				position_x++;
		}
		else if (position_y==1) {
			if (input=='d')
				position_y++;
			if (input=='w')
				position_x--;
			if (input=='s')
				position_x++;
		}
		
		if (input==' ') {
			bullet_x=position_x-1;
			bullet_y=position_y;
		}

	}
}

void updateWithoutInput() {//输入无关
	if ((bullet_x==enemy_x)&&(bullet_y==enemy_y)) {
		score++;
		enemy_x=0;
		bullet_x=-1;
		enemy_y=rand() % width;
		if (enemy_speed_limit>1) {
			enemy_speed_limit--;
			Degree_of_difficulty++;
		}
	}

	if (bullet_x>-1)
		bullet_x--;
	static int speed=0;
	if (speed<enemy_speed_limit)//控制飞机下落速度
		speed++;
	if(speed==enemy_speed_limit) {
		if (enemy_x>high) {
			enemy_y=rand() % width;
			enemy_x=0;
		}
		else
			enemy_x++;
			speed=0;
		}
	
}

int main() {
	startup();
	while(1) {
		show();
		updateWithInput();
		updateWithoutInput();
	}

return 0;
}